package cn.juque.jdfsystem.console.task;

import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.RandomUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;

/**
 * @author juque
 * @version 1.0.0
 * <ul>
 *     <li>AbstractTask</li>
 * </ul>
 * @date 2023-01-11 00:20:35
 **/
@Slf4j
public abstract class AbstractTask {

    private static final String NAME = "AbstractTask";

    /**
     * 开始执行
     *
     * @param args 参数
     */
    @Async("jdfExecutor")
    public void start(String[] args) {
        if (!this.before()) {
            return;
        }
        Integer sleep = this.initSleepTimes();
        if (null != sleep) {
            sleep = sleep <= 1 ? 2 : sleep;
            int seconds = RandomUtil.randomInt(1, sleep);
            log.info("{}任务等待时长:{}s", this.getTaskName(), sleep);
            ThreadUtil.sleep(seconds * 1000L);
        }
        // 执行业务逻辑
        this.execute(args);
    }

    /**
     * 任务开始前的操作
     *
     * @return true 可以继续往下执行；false 相反
     */
    public boolean before() {
        return Boolean.TRUE;
    }

    /**
     * 任务逻辑
     *
     * @param args 参数
     */
    public abstract void execute(String[] args);

    /**
     * 设置随机休眠等待最大时长 单位：秒
     *
     * @return 秒
     */
    protected abstract Integer initSleepTimes();

    protected String getTaskName() {
        return NAME;
    }
}
